import { auth } from '@clerk/nextjs/server';
import { notFound } from 'next/navigation';
import { validate as uuidValidate } from 'uuid';

import { ContestSectionVisibility } from '@/components/contest/util';
import { ContestSchema } from '@/hooks/useContestClip';
import { Clip } from '@/state/clipStore';

import SunoCollabsPage from './SunoCollabsPage';
import { transformLandingToPageData } from './landingTransform';
import { generateMetadata, getContestLanding } from './metadata';

type Props = {
  params: Promise<{ contest_id: string }>;
  searchParams: Promise<{ [key: string]: string | string[] | undefined }>;
};

export { generateMetadata };

export default async function SunoCollabsPageDefine(props: Props) {
  const params = await props.params;
  let contestId = params.contest_id;

  // Validate contest ID format
  if (!uuidValidate(contestId)) {
    contestId = contestId?.toLowerCase();
  }

  let contest: ContestSchema;
  let contestClip: Clip | null = null;

  const { getToken } = await auth();
  let accessToken = null;
  try {
    accessToken = await getToken();
  } catch (e) {
    console.log(e);
  }

  try {
    // Fetch landing data (contest and optional clip)
    const landing = await getContestLanding(contestId, accessToken);

    if (!landing || !landing.contest) {
      return (
        <div className='flex h-screen w-screen items-center justify-center text-center font-sans'>
          Contest not found
        </div>
      );
    }

    contest = landing.contest;
    // Use clip provided by landing endpoint if available and not hidden
    const clip = landing.contest_clip as any as Clip | undefined;
    if (clip && !(clip as any).is_hidden) {
      contestClip = clip;
    }

    if (
      !landing.contest_hub_enabled ||
      contest.contest_visibility_level === ContestSectionVisibility.None ||
      !contest.contest_visibility_level
    ) {
      return (
        <div className='flex h-screen w-screen items-center justify-center text-center font-sans'>
          You don&apos;t have access to this contest.
        </div>
      );
    }

    const landingData = transformLandingToPageData(landing);

    return (
      <SunoCollabsPage
        contest={contest}
        contestClip={contestClip}
        landingData={landingData}
      />
    );
  } catch (e) {
    console.log('Failed to load contest', e);
    notFound();
  }
}
